<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>取回多个文档 | Elasticsearch: 权威指南 | Elastic</title>
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
</head>
<body>
<div class="main-container">
    <section id="content">
        
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原文地址: <a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/_Retrieving_Multiple_Documents.html" rel="nofollow">https://www.elastic.co/guide/cn/elasticsearch/guide/current/_Retrieving_Multiple_Documents.html</a>, 版权归 www.elastic.co 所有<br/>
                            英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/guide/current/_Retrieving_Multiple_Documents.html" rel="nofollow">https://www.elastic.co/guide/en/elasticsearch/guide/current/_Retrieving_Multiple_Documents.html</a>
                            </div>
                        <!-- start body -->
                  <div class="page_header">
<b>请注意:</b><br>本书基于 Elasticsearch 2.x 版本，有些内容可能已经过时。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: 权威指南</a></span>
»
<span class="breadcrumb-link"><a href="getting-started.html">基础入门</a></span>
»
<span class="breadcrumb-link"><a href="data-in-data-out.html">数据输入和输出</a></span>
»
<span class="breadcrumb-node">取回多个文档</span>
</div>
<div class="navheader">
<span class="prev">
<a href="partial-updates.html">« 文档的部分更新</a>
</span>
<span class="next">
<a href="bulk.html">代价较小的批量操作 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="_Retrieving_Multiple_Documents"></a>取回多个文档<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/030_Data/50_Mget.asciidoc">edit</a>
</h2>
</div></div></div>
<p>Elasticsearch 的速度已经很快了，但甚至能更快。
将多个请求合并成一个，避免单独处理每个请求花费的网络延时和开销。
如果你需要从 Elasticsearch 检索很多文档，那么使用 <em>multi-get</em> 或者 <code class="literal">mget</code> API
来将这些检索请求放在一个请求中，将比逐个文档请求更快地检索到全部文档。</p>
<p><code class="literal">mget</code> API 要求有一个 <code class="literal">docs</code> 数组作为参数，每个元素包含需要检索文档的元数据，
包括 <code class="literal">_index</code> 、 <code class="literal">_type</code> 和 <code class="literal">_id</code> 。如果你想检索一个或者多个特定的字段，那么你可以通过 <code class="literal">_source</code> 参数来指定这些字段的名字：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET /_mget
{
   "docs" : [
      {
         "_index" : "website",
         "_type" :  "blog",
         "_id" :    2
      },
      {
         "_index" : "website",
         "_type" :  "pageviews",
         "_id" :    1,
         "_source": "views"
      }
   ]
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/030_Data/50_Mget.json"></div>
<p>该响应体也包含一个 <code class="literal">docs</code> 数组，
对于每一个在请求中指定的文档，这个数组中都包含有一个对应的响应，且顺序与请求中的顺序相同。
其中的每一个响应都和使用单个 <a class="xref" href="get-doc.html" title="取回一个文档"><code class="literal">get</code> request</a> 请求所得到的响应体相同：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">{
   "docs" : [
      {
         "_index" :   "website",
         "_id" :      "2",
         "_type" :    "blog",
         "found" :    true,
         "_source" : {
            "text" :  "This is a piece of cake...",
            "title" : "My first external blog entry"
         },
         "_version" : 10
      },
      {
         "_index" :   "website",
         "_id" :      "1",
         "_type" :    "pageviews",
         "found" :    true,
         "_version" : 2,
         "_source" : {
            "views" : 2
         }
      }
   ]
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/030_Data/50_Mget.json"></div>
<p>如果想检索的数据都在相同的 <code class="literal">_index</code> 中（甚至相同的 <code class="literal">_type</code> 中），则可以在 URL 中指定默认的 <code class="literal">/_index</code> 或者默认的  <code class="literal">/_index/_type</code> 。</p>
<p>你仍然可以通过单独请求覆盖这些值：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET /website/blog/_mget
{
   "docs" : [
      { "_id" : 2 },
      { "_type" : "pageviews", "_id" :   1 }
   ]
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/030_Data/50_Mget.json"></div>
<p>事实上，如果所有文档的 <code class="literal">_index</code> 和 <code class="literal">_type</code> 都是相同的，你可以只传一个 <code class="literal">ids</code> 数组，而不是整个 <code class="literal">docs</code> 数组：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">GET /website/blog/_mget
{
   "ids" : [ "2", "1" ]
}</pre>
</div>
<p>注意，我们请求的第二个文档是不存在的。我们指定类型为 <code class="literal">blog</code> ，但是文档 ID <code class="literal">1</code> 的类型是 <code class="literal">pageviews</code> ，这个不存在的情况将在响应体中被报告：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">{
  "docs" : [
    {
      "_index" :   "website",
      "_type" :    "blog",
      "_id" :      "2",
      "_version" : 10,
      "found" :    true,
      "_source" : {
        "title":   "My first external blog entry",
        "text":    "This is a piece of cake..."
      }
    },
    {
      "_index" :   "website",
      "_type" :    "blog",
      "_id" :      "1",
      "found" :    false  <a id="CO15-1"></a><i class="conum" data-value="1"></i>
    }
  ]
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/030_Data/50_Mget.json"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO15-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>未找到该文档。</p>
</td>
</tr>
</table>
</div>
<p>事实上第二个文档未能找到并不妨碍第一个文档被检索到。每个文档都是单独检索和报告的。</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>即使有某个文档没有找到，上述请求的 HTTP 状态码仍然是 <code class="literal">200</code> 。事实上，即使请求 <em>没有</em> 找到任何文档，它的状态码依然是 <code class="literal">200</code>
--因为 <code class="literal">mget</code> 请求本身已经成功执行。
为了确定某个文档查找是成功或者失败，你需要检查 <code class="literal">found</code> 标记。</p>
</div>
</div>
</div>
<div class="navfooter">
<span class="prev">
<a href="partial-updates.html">« 文档的部分更新</a>
</span>
<span class="next">
<a href="bulk.html">代价较小的批量操作 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>